优化移动端游戏性能 | 来自Unity顶级工程师的物理、UI和音频设置小贴士
Unity Accelerate Solution 团队对 Unity 引擎的源代码了如指掌,可帮助客户们最大限度地利用引擎。我们请到了这支 Unity 最为资深的软件工程师团队分享了一系列移动游戏优化方面的专业知识。
作为本系列的最后一篇文章,Unity 最为资深的软件工程师团队将着重介绍怎样设置物理、UI 和音频。另外两篇分别介绍了性能分析、内存和代码架构的优化(点击回看)及图形与资源相关的优化(点击回看),完整教程已搬运至 Unity 中文课堂,欢迎点击“阅读原文”查看:
https://learn.u3d.cn/tutorial/mobile-game-optimization
物理
Unity 的内置物理系统 (Nvidia PhysX) 在移动设备上开销较大。下面的提示可以帮助您每秒减少更多帧。
优化设置
在 PlayerSettings 中,尽可能选中 Prebake Collision Meshes。
请务必同时编辑 Physics 设置 (Project Settings > Physics)。尽可能简化 Layer Collision Matrix。
禁用 Auto Sync Transforms 并启用 Reuse Collision Callbacks。
修改物理项目设置以进一步提高性能
简化碰撞体
网格碰撞体开销较大。用简单的原始碰撞体或网格碰撞体代替更复杂的网格碰撞体来近似原始形状。
将以减 Fixed Timestep 修改为与目标帧率相符,降低 Maximum Allowed Timestep 以减少性能毛刺
通过 Physics Debugger 实现可视化
使用 Physics Debug 窗口 (Window > Analysis > Physics Debugger) 可帮助故障检查有问题的碰撞体或者出现差异的情况。下面是一个颜色编码的指示器,指示哪些游戏对象可以相互碰撞。
用户界面 UI
禁用在默认情况下处于活动状态的 Ignore Reversed Graphics
尽可能禁用 Raycast Target
https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIAutoLayout.html
布局组会降低性能,尤其是在嵌套时
避免使用大型列表和网格视图
大型列表和网格视图开销很大。如果需要创建大型列表或网格视图(如包含成百上千项目的物品栏屏幕),可以考虑重复使用较小的 UI 元素池,而不是为每个项目都创建 UI 元素。请参阅此示例 GitHub 项目了解实际方法。
GitHub 项目:
避免大量使用重叠元素
对大量 UI 元素(如卡牌游戏中堆叠的卡牌)分层会造成过度绘制。自定义代码在运行时将分层元素合并到更少的元素和批次中。
使用多种分辨率和宽高比
现在,移动设备使用的分辨率和屏幕大小极为不同,创建不同的 UI 版本可以按设备提供最佳体验。
UI 版本:
使用设备模拟器可以预览 UI 在各种受支持的设备上的呈现。您也可以在XCode 和 Android Studio 中创建虚拟设备。
设备模拟器:
使用设备模拟器预览各种屏幕格式
使用全屏 UI 时,隐藏其他全部内容
如果暂停屏幕或者启动屏幕遮住场景中的其他全部内容,则禁用摄像机对 3D 场景的渲染。同样,禁用隐藏在顶层画布之后的所有背景画布元素。
由于不需要以 60 fps 的帧率进行更新,可以考虑在全屏 UI 过程中降低 Application.targetFrameRate。
将摄像机分配给世界空间画布和摄像机空间画布
将 Event 或 Render Camera 字段留空会使 Unity 填充 Camera.main,这会导致不必要的开销。
尽可能使画布 RenderMode 采用 Screen Space - Overlay,这样就不需要摄像机。
音频
尽管音频通常不会造成性能瓶颈,还是可以进行优化以节省内存。
尽量使用单声道声音剪辑
如果要使用 3D 空间音频, 请以单声道 (single channel) 的形式创作声音剪辑,或者启用 Force To Mono 设置。在运行时定位使用的多声道声音会扁平化为单声道源,因此会增加 CPU 开销和浪费内存。
尽可能使用原始未压缩 WAV 文件作为源资源
如果使用任何压缩格式(如 MP3 或 Vorbis),Unity 会将其解压并在构建时重新压缩。这样会导致两个有损通道,从而降低最终质量。
压缩剪辑并降低压缩比特率
通过压缩减小剪辑的大小和内存使用量 :
移动设备上的音效最高为 22,050 Hz。使用较低设置通常对最终质量影响很小,当然,请使用您自己的耳朵来判断。
每个剪辑大小的设置都不同。
从内存中卸载静音的音频源 (AudioSources)
实现静音按钮时,不要只是将音量设置为 0。可以销毁 AudioSource 组件,从而将其从内存中卸载,这样,播放器不需要过于频繁地切换开关。
长按关注
第一时间了解Unity引擎动向,学习最新开发技巧
点击“阅读原文”,跳转Unity中文课堂